/** @noSelfInFile **/
import {LocModel} from "../../../base/LocModel";
import {IItemAdapter} from "../../adapterInterface/model3/IItemAdapter";
import Configer from "../../../config/Configer";
import {FinalKey} from "../../../../../constant/FinalConstant";
import {globalAdapter} from "../../adapterInterface/model1/IGlobalAdapter";

// todo 【需要被回退】
// export class ItemAdapter implements IItemAdapter {
//
//     createHandle(id: string, loc: LocModel) {
//         const itemUnitId = Configer.getFinal(FinalKey.itemUnitId);
//         const neutralInvincibleId = globalAdapter.adapter.getNeutralInvinciblePlayerId();
//         const player = Player(neutralInvincibleId);
//         const unit = CreateUnit(player, itemUnitId, loc.x, loc.y, 0);
//         return unit;
//     };
//
//     getLife(handle: any): number {
//         if (handle) {
//             return GetWidgetLife(handle);
//         } else {
//             return 0;
//         }
//     }
//
//     getLoc(handle: any): LocModel {
//         const locModel: LocModel = new LocModel(GetUnitX(handle), GetUnitY(handle));
//         return locModel;
//     }
//
//     getName(handle: any): string {
//         return GetUnitName(handle);
//     }
//
//     getShow(handle: any): boolean {
//         return !IsItemHiddenBJ(handle)
//     }
//
//     getStrId(handle: any): string {
//         return id2string(GetUnitTypeId(handle));
//     }
//
//     isAlive(handle: any): boolean {
//         const life = this.getLife(handle);
//         if (life && life > 0.4) {
//             return true;
//         }
//         return false;
//     }
//
//     isValid(handle: any): boolean {
//         if (handle) {
//             return true;
//         }
//         return false;
//     }
//
//     setLife(handle: any, value: number): void {
//         SetWidgetLife(handle, value);
//     }
//
//     setLoc(handle: any, locModel: LocModel): void {
//         SetItemPosition(handle, locModel.x, locModel.y);
//     }
//
//     setShow(handle: any, show: boolean): void {
//         SetItemVisibleBJ(show, handle);
//     }
//
//     bindHandle(handle: any): void {
//         handle_ref(handle);
//     }
//
//     destroy(handle: any): void {
//         this.setLoc(handle, new LocModel(-10000, -10000));
//         handle_unref(handle);
//         RemoveItem(handle);
//     }
//
//     equal(handle1: any, handle2: any): boolean {
//         return (GetHandleId(handle1) === GetHandleId(handle2))
//     }
// }

export class ItemAdapter implements IItemAdapter {

    createHandle(id: string, loc: LocModel) {
        return CreateItem(id, loc.x, loc.y)
    };

    getCharges(handle: any): number {
        return GetItemCharges(handle);
    }

    getInvulnerable(handle: any): boolean {
        return IsItemInvulnerable(handle);
    }

    getLife(handle: any): number {
        if (handle) {
            return GetWidgetLife(handle);
        } else {
            return 0;
        }
    }

    getLoc(handle: any): LocModel {
        const locModel: LocModel = new LocModel(GetItemX(handle), GetItemY(handle));
        return locModel;
    }

    getName(handle: any): string {
        return GetItemName(handle);
    }

    getShow(handle: any): boolean {
        return !IsItemHiddenBJ(handle)
    }

    getStrId(handle: any): string {
        return id2string(GetItemTypeId(handle));
    }

    isAlive(handle: any): boolean {
        const life = this.getLife(handle);
        if (life && life > 0.4) {
            return true;
        }
        return false;
    }

    isPawnable(handle: any): boolean {
        return IsItemPawnable(handle);
    }

    isPowerup(handle: any): boolean {
        return IsItemPowerup(handle);
    }

    isValid(handle: any): boolean {
        if (handle) {
            return true;
        }
        return false;
    }

    setCharges(handle: any, value: number): void {
        SetItemCharges(handle, value);
    }

    setDropOnDeath(handle: any, flag: boolean): void {
        SetItemDropOnDeath(handle, flag);
    }

    setDroppable(handle: any, flag: boolean): void {
        SetItemDroppable(handle, flag);
    }

    setInvulnerable(handle: any, flag: boolean): void {
        SetItemInvulnerable(handle, true);
    }

    setLife(handle: any, value: number): void {
        SetWidgetLife(handle, value);
    }

    setLoc(handle: any, locModel: LocModel): void {
        SetItemPosition(handle, locModel.x, locModel.y);
    }

    setShow(handle: any, show: boolean): void {
        SetItemVisibleBJ(show, handle);
    }

    bindHandle(handle: any): void {
        handle_ref(handle);
    }

    destroy(handle: any): void {
        this.setLoc(handle, new LocModel(-10000, -10000));
        handle_unref(handle);
        RemoveItem(handle);
    }

    equal(handle1: any, handle2: any): boolean {
        return (GetHandleId(handle1) === GetHandleId(handle2))
    }
}